package cn.geekyspace.scanhive.infrastructure.ui;

import cn.geekyspace.scanhive.common.ui.UIAlertUtils;
import cn.geekyspace.scanhive.infrastructure.plc.PLCSerialPortManager;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ToggleButton;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * UI PLC串口设置组件
 */
@Data
@Slf4j
@Component
@RequiredArgsConstructor
public class UIPlcPortSettings {

    private ToggleButton connectToggleButton;      // 按钮（连接/断开）
    private ComboBox<String> serialPortComboBox;   // 下拉框

    // 注入 PLC 串口管理器
    private final PLCSerialPortManager plcSerialPortManager;

    /** 初始化串口选择下拉框并加载可用端口 */
    public  void initSerialPortComboBox(ComboBox<String> serialPortComboBox) {
        this.serialPortComboBox = serialPortComboBox;
        this.serialPortComboBox.getItems().addAll(plcSerialPortManager.getAvailableSerialPorts());
    }


    /** 处理连接/断开按钮点击 */
    public void handleConnectButtonClick() {
        String portItem = serialPortComboBox.getValue();

        // 未选择串口，提示并回退按钮状态
        if (portItem == null) {
            UIAlertUtils.info("未选择串口", "请从串口下拉框中选择一个串口再进行连接操作。");
            connectToggleButton.setSelected(false);
            return;
        }

        String portName = getPortName(portItem);
        boolean isConnectAction = connectToggleButton.isSelected();
        boolean success = isConnectAction
                ? plcSerialPortManager.openPort(portName)
                : plcSerialPortManager.closePort();

        if (success) {
            connectToggleButton.setText(isConnectAction ? "断开" : "连接");  // 执行成功更新按钮文本
        } else {
            UIAlertUtils.info(isConnectAction ? "无法连接到串口" : "无法断开串口", "串口 " + portName + " 不存在或已被其他应用程序占用！");
            connectToggleButton.setSelected(!isConnectAction);             // 执行失败回退按钮状态
        }
    }

    // 提取串口名称用作串口连接，如 COM1 # 描述信息 -> COM1
    private static String getPortName(String selectedPort) {
        // 按空格拆分，取第一个部分（例如 COM1 #描述信息 -> COM1）
        return selectedPort.split(" #")[0].trim();
    }

}
